/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package myftp.app.view;

import myftp.app.renderer.TransfertTableEditor;
import myftp.app.renderer.TransfertTableRenderer;
import java.awt.Dimension;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import javax.swing.JProgressBar;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import myftp.app.model.TransfertTableModel;
import myftp.app.renderer.ProgressBarRenderer;
import myftp.core.view.AbstractView;

/**
 *
 * @author CAVARLE Glenn, LUCAS Stéphane
 *Vue permettant l'affichage de la liste des transferts
 */
public class TransfertView extends AbstractView {

    /**
     * Table des transfert
     * @var transfertTable
     */
    public JTable transfertTable = new JTable();
    /**
     * Listener du scroller de la table
     * @var scroller
     */
    TransfertsScrollListener scroller = null;

    public AbstractView init() {

        /* Création du model du tableau */
        TransfertTableModel table = new TransfertTableModel();

        transfertTable.setModel(table);

        /* Une seule séléction a la fois est possible */
        transfertTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        transfertTable.setDragEnabled(true);

        /* Création du renderer et de l'editor pour la mise en forme des éléments */
        transfertTable.setDefaultRenderer(Object.class, new TransfertTableRenderer(table));
        transfertTable.setDefaultEditor(Object.class, new TransfertTableEditor(table));

        /* Réorganisation impossible (a cause des renderer et editor) */
        transfertTable.getTableHeader().setReorderingAllowed(false);
        transfertTable.setAutoscrolls(true);

        /* Création du renderer de la barre de progression de 0 à 100 */
        ProgressBarRenderer pbr = new ProgressBarRenderer(0, 100);
        pbr.setStringPainted(true);
        /* Attachement du renderer de la barre de progression à la colonne les contenants */
        transfertTable.setDefaultRenderer(JProgressBar.class, pbr);

        transfertTable.setEnabled(true);


        /* Mise du tableau dans un JScrollPane (pour le défilement vertical) */
        JScrollPane scrollTab = new JScrollPane(transfertTable);
        scrollTab.setPreferredSize(new Dimension(1000, 180));
        scrollTab.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        scrollTab.addComponentListener(new ViewListener(this));
        scroller = new TransfertsScrollListener(scrollTab);
        transfertTable.addComponentListener(scroller);

        this.add(scrollTab);

        this.invalidate();
        return this;
    }

    public TransfertsScrollListener getScroller() {
        return scroller;
    }

    public JTable getTransfertTable() {
        return this.transfertTable;
    }

    /**
     * Listener pour le scrolling auto de la table des transferts
     */
    public class TransfertsScrollListener implements ComponentListener {

        private JScrollPane pane;

        TransfertsScrollListener(JScrollPane pane) {
            this.pane = pane;
        }

        public void revalidate() {
            transfertTable.revalidate();
        }

        /**
         * Si le composant est redimensionné
         */
        public void componentResized(ComponentEvent e) {
            JScrollBar bar = this.pane.getVerticalScrollBar();
            /* Mise au maximum de la barre de défilement verticale */
            bar.setValue(bar.getMaximum());
        }

        /**
         * Redimensionnement du tableau des transferts
         */
        public void doResize() {
            JScrollBar bar = this.pane.getVerticalScrollBar();
            this.revalidate();
            /* Mise au maximum de la barre de défilement verticale */
            bar.setValue(bar.getMaximum());
        }

        public void componentMoved(ComponentEvent e) {
        }

        public void componentShown(ComponentEvent e) {
        }

        public void componentHidden(ComponentEvent e) {
        }
    }
}
